#pragma once
#include <iostream>
#include <string>
#include <functional>
#include "InetAddr.hpp"


class Reactor;    // 声明
class Connection; // 声明
using func_t = std::function<void(Connection *)>;

class Connection
{
public:
    Connection(int sock) : _sock(sock),_R(nullptr)
    {
    }

    int Sockfd()
    {
        return _sock;
    }

    uint32_t Events()
    {
        return _events;
    }

    void SetEvents(int events)
    {
        _events = events; // 设置关心的事件
    }

    // 设置回调函数
    void Register(func_t recver, func_t sender, func_t excepter)
    {
        _recver = recver;
        _sender = sender;
        _excepter = excepter;
    }

    void SetSelf(Reactor *R)
    {
        _R = R;
    }

    void AppendInBuffer(const std::string &buff)
    {
        _inbuffer += buff;// 将数据追加到输入缓冲区
    }

    void AppendOutBuffer(const std::string &buff)
    {
        _outbuffer += buff;// 将数据追加到输入缓冲区
    }

    bool OutbufferEmpty()
    {
        return _outbuffer.empty();
    }

    std::string& Outbuffer()
    {
        return _outbuffer;// 返回输出缓冲区
    }

    void OutbufferRemove(int n)
    {
        _outbuffer.erase(0,n);// 删除缓冲区0-n数据
    }

    std::string& Inbuffer()
    {
        return _inbuffer;// 返回输入缓冲区
    }

    void Close()
    {
        if(_sock >= 0)
        {
            close(_sock); // 关闭套接字
        }
    }

    ~Connection()
    {
    }

private:
    int _sock;              // 套接字
    std::string _inbuffer;  // 输入缓冲区
    std::string _outbuffer; // 输出缓冲区

    InetAddr _addr; // 地址

    uint32_t _events; // 关心的事件


public:
    func_t _recver;   // 接收回调函数
    func_t _sender;   // 发送回调函数
    func_t _excepter; // 异常回调函数

    Reactor *_R; // 所属的Reactor
};
